/*
 * s_nor_flash.c
 *
 *  Created on: Sep 11, 2020
 *      Author: hemingway
 */
#include "s_nor_flash.h"

#include <stdlib.h>
#include <stdbool.h>

// #include "flash_interface.h"

#include <stdio.h>
#include <string.h>

// #include "h_cc2640r2f_define.h"

// #include "h_stm32_hal_spi_norflash.h"
#include "s_nor_flash_user.h"

#define S_NOR_FLASH_START_ADDR				15728640 //15 * 1024 * 1024
#define S_NOR_FLASH_END_ADDR				16777216 //16 * 1024 * 1024


signed char S_Nor_Flash_Init(void)
{
    return 0;
}

signed char S_Nor_Flash_Write_Para_Struct(unsigned char *data, unsigned short len)
{
	unsigned char rslt = 0U;

	unsigned short clear_page_num = 1U, i = 0;

	if(len >= 4096)
	{
		clear_page_num = len / 4096;
		if(len % 4096)
		{
			clear_page_num++;
		}
	}

	// Not more than 16Mbit
	clear_page_num = clear_page_num > 255 ? 255 : clear_page_num;

	h_stm32_spi_norFlash_open();

	for(i = 0; i < clear_page_num; i++)
	{
		rslt = h_stm32_spi_norFlash_erasePage((S_NOR_FLASH_START_ADDR / 4096) + i);
	}

	if(rslt)
	{
		printf("eraese faied\r\n");
		h_stm32_spi_norFlash_close();
		return (-2);
	}

	rslt = h_stm32_spi_norFlash_write(S_NOR_FLASH_START_ADDR, data, len);

	h_stm32_spi_norFlash_close();

	if(rslt)
	{
		return (-1);
	}
	else
	{
		return 0;
	}
}

signed char S_Nor_Flash_Read_Para_Struct(unsigned char *data, unsigned short len)
{
	unsigned char rslt = 0U;

	h_stm32_spi_norFlash_open();

	rslt = h_stm32_spi_norFlash_read(S_NOR_FLASH_START_ADDR, data, len);

	h_stm32_spi_norFlash_close();

	if(rslt)
	{
		return (-1);
	}
	else
	{
		return 0;
	}
}


// #include "h_stm32_hal_uart.h"

// #include "ff.h"
// #include "diskio.h"

// // FATFS FatFs;				/* File system object for each logical drive */
// // FIL File[2];				/* File objects */
// // DIR Dir;					/* Directory object */
// // FILINFO Finfo;

// void fatfs_test(void)
// {
//     FATFS fs;           /* Filesystem object */
//     FIL fil;            /* File object */
//     FRESULT res;        /* API result code */
//     UINT bw;            /* Bytes written */
//     BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */

//     unsigned char rdata[32];

//     MKFS_PARM opt = {
//         FM_FAT32,
//         0,
//         0,
//         0,
//         0
//     };


//     // f_mount(&fs, "0:", 1);

//     // res = f_mkfs("0:", 0, work, sizeof(work));
    
//     // printf("mkfs res %d\r\n", res);

//     // if(res != FR_OK) {
//     //     return;
//     // }

//     f_mount(&fs, "0:", 1);

//     f_unlink("hello.txt");


//     res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);

//     printf("open res %d\r\n", res);

//     if(res != FR_OK) {
//         return;
//     }

//     f_write(&fil, "Hello, World!\0\r\n", 16, &bw);

//     if (bw != 16) {
//         printf("write failed: %d\r\n", bw);
//     }

//     f_close(&fil);

//     res = f_open(&fil, "hello.txt", FA_READ);

//     printf("reopen res %d\r\n", res);

//     if(res != FR_OK) {
//         return;
//     }

//     memset(rdata, 0xFF, 32);

//     res = f_read(&fil, rdata, 15, &bw);

//     printf("the bw is %d\r\n", bw);

//     printf("rdata: %s\n", rdata);

//     f_close(&fil);
// }

// signed char S_Nor_Flash_Test(void)
// {
//     int i = 0; //5000;
//     while(i--) {
//         fatfs_test();
//     }

//     fatfs_test();
    
//     // // FRESULT rslt;
//     // // rslt = f_open(&File[0], "test.txt", "a+");

//     // // printf("rslt is %d\r\n", rslt);
//     // FATFS fs;           /* Filesystem object */
//     // FIL fil;            /* File object */
//     // FRESULT res;        /* API result code */
//     // UINT bw;            /* Bytes written */
//     // BYTE work[FF_MAX_SS]; /* Work area (larger is better for processing time) */

//     // unsigned char rdata[32];




//     // // res = f_mount(&fs, "", 0);
//     // // printf("res %d\r\n", res);
//     // /* Format the default drive with default parameters */
//     // f_mount(&fs, "", 0);
//     // res = f_mkfs("", 0, work, sizeof(work));
    
//     // printf("mkfs res %d\r\n", res);

//     // printf("--Close spi flash here\r\n--");

//     // h_stm32_spi_norFlash_close();

//     // f_mount(&fs, "", 0);

//     // res = f_open(&fil, "hello.txt", FA_CREATE_NEW | FA_WRITE);

//     // printf("open res %d\r\n", res);

//     // f_write(&fil, "Hello, World!\r\n", 15, &bw);

//     // if (bw != 15) {
//     //     printf("write failed: %d\r\n", bw);
//     // }

//     // f_close(&fil);

//     // res = f_open(&fil, "hello.txt", FA_READ);

//     // printf("reopen res %d\r\n", res);

//     // memset(rdata, 0xFF, 32);

//     // res = f_read(&fil, rdata, 15, &bw);

//     // printf("the bw is %d\r\n", bw);

//     // printf("rdata: %s\n", rdata);

//     // f_close(&fil);

//     // // unsigned char data[1024];


//     // // printf("init finished\n");
//     // // h_stm32_spi_norFlash_open();

//     // // // memset(data, 0xFF, 1024);

    

//     // // // h_stm32_spi_norFlash_eraseChip();

//     // // // h_stm32_spi_norFlash_read(0, data, 1024);
//     // // // debug_hex(data, 1024);

//     // // short i = 0;
//     // // for(; i < 1024; i++) {
//     // //     data[i] = i;
//     // // }



//     // // h_stm32_spi_norFlash_write(0, data, 1024);
//     // // memset(data, 0xFF, 1024);
//     // // h_stm32_spi_norFlash_read(0, data, 1024);
//     // // debug_hex(data, 1024);



//     // // printf("erease %d\r\n", h_stm32_spi_norFlash_erase(128, 512));
//     // // memset(data, 0xFF, 1024);
//     // // h_stm32_spi_norFlash_read(0, data, 1024);
//     // // debug_hex(data, 1024);


//     return 0;
// }

